package com.example.chamberlainserver.mapper;

import com.example.chamberlainserver.Entry.Role;
import com.example.chamberlainserver.Entry.User;
import com.example.chamberlainserver.Entry.UserRole;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 用户角色关联数据访问接口
 */
@Mapper
public interface UserRoleMapper {
    /**
     * 根据用户ID查询用户角色关联
     */
    List<UserRole> getUserRolesByUserId(@Param("userId") Integer userId);
    
    /**
     * 根据角色ID查询用户角色关联
     */
    List<UserRole> getUserRolesByRoleId(@Param("roleId") Integer roleId);
    
    /**
     * 根据用户ID查询用户的角色列表
     */
    List<Role> getRolesByUserId(@Param("userId") Integer userId);
    
    /**
     * 根据部门ID查询用户角色关联
     */
    List<UserRole> getUserRolesByDepartmentId(@Param("departmentId") Integer departmentId);
    
    /**
     * 根据部门ID和角色ID查询用户列表
     */
    List<User> getUsersByDepartmentAndRole(@Param("departmentId") Integer departmentId, @Param("roleId") Integer roleId);
    
    /**
     * 根据部门ID和角色代码查询用户列表
     */
    List<User> getUsersByDepartmentAndRoleCode(@Param("departmentId") Integer departmentId, @Param("roleCode") String roleCode);
    
    /**
     * 新增用户角色关联
     */
    int insertUserRole(UserRole userRole);
    
    /**
     * 批量新增用户角色关联
     */
    int batchInsertUserRole(List<UserRole> userRoles);
    
    /**
     * 删除用户角色关联
     */
    int deleteUserRole(@Param("userId") Integer userId, @Param("roleId") Integer roleId);
    
    /**
     * 根据用户ID删除所有用户角色关联
     */
    int deleteUserRolesByUserId(@Param("userId") Integer userId);
    
    /**
     * 根据角色ID删除所有用户角色关联
     */
    int deleteUserRolesByRoleId(@Param("roleId") Integer roleId);
    
    /**
     * 检查用户是否拥有指定角色
     */
    boolean hasRole(@Param("userId") Integer userId, @Param("roleId") Integer roleId);
    
    /**
     * 检查用户是否拥有指定角色代码
     */
    boolean hasRoleByCode(@Param("userId") Integer userId, @Param("roleCode") String roleCode);
    
    /**
     * 分页查询部门下的用户角色列表
     */
    List<Map<String, Object>> getPagedUserRolesByDepartment(Map<String, Object> params);
    
    /**
     * 获取部门下的用户角色总数
     */
    Long getCountUserRolesByDepartment(Map<String, Object> params);
}